package com.exception;


import java.io.IOException;
import java.io.UnsupportedEncodingException;

/*
##多case语句
    凡是可能抛出异常的语句，都可以用try ... catch捕获。把可能发生异常的语句放在try { ... }中，然后使用catch捕获对应的Exception及其子类。
    可以使用多个catch语句，每个catch分别捕获对应的Exception及其子类。JVM在捕获到异常后，会从上到下匹配catch语句，匹配到某个catch后，执行catch代码块，然后不再继续匹配。
    简单地说就是：多个catch语句只有一个能被执行。
    存在多个catch的时候，catch的顺序非常重要：子类必须写在前面。
##finally语句
    无论是否有异常发生，如果我们都希望执行一些语句，例如清理工作，怎么写？
    可以把执行语句写若干遍：正常执行的放到try中，每个catch再写一遍。
    注意finally有几个特点：

        finally语句不是必须的，可写可不写；
        finally总是最后执行。
        如果没有发生异常，就正常执行try { ... }语句块，然后执行finally。如果发生了异常，就中断执行try { ... }语句块，然后跳转执行匹配的catch语句块，最后执行finally。

    可见，finally是用来保证一些代码必须执行的。
    某些情况下，可以没有catch，只使用try ... finally结构。
##捕获多种异常
    如果某些异常的处理逻辑相同，但是异常本身不存在继承关系，那么就得编写多条catch子句
    因为处理IOException和NumberFormatException的代码是相同的，所以我们可以把它两用|合并到一起
    catch (IOException | NumberFormatException e) { // IOException或NumberFormatException
        System.out.println("Bad input");
    }
##小结
    使用try ... catch ... finally时：
    多个catch语句的匹配顺序非常重要，子类必须放在前面；
    finally语句保证了有无异常都会执行，它是可选的；
    一个catch语句也可以匹配多个非继承关系的异常。
 */
public class TreCase {
    public static void main(String[] args) {
        /*
        try {
            //process1();
            process2();
            process3();
        } catch (IOException e) {
            System.out.println("IO error");
        } catch (UnsupportedEncodingException e) { // 永远捕获不到
            System.out.println("Bad encoding");
        }

         */
    }
}
